/**
 ******************************************************************************
 * @file     EepromCheck.h
 * @author   zxp
 * @version  V1.0.0
 * @date     2021-01-01
 * @brief    用于通过验证EEPROM中的数据判断设备当前状态
 ******************************************************************************
 */

#ifndef __EEPROM_CHECK_H_
#define __EEPROM_CHECK_H_

#include <EEPROM.h>

template <class T>
class EepromCheck
{
private:
    /* data */
public:
    EepromCheck(/* args */);
    ~EepromCheck();
    size_t save(size_t, T const &);
    size_t fetch(size_t, T &);
};
template <class T>
EepromCheck<T>::EepromCheck(/* args */)
{
}

template <class T>
EepromCheck<T>::~EepromCheck()
{
}

template <class T>
size_t EepromCheck<T>::save(size_t addr, T const &data)
{
    uint8_t *p;
    size_t i, len = sizeof(T) / sizeof(uint8_t);

    p = (uint8_t *)(&data);
    for (i = 0; i < len; i++)
    {
        EEPROM.write(addr + i, p[i]);
    }
    EEPROM.commit();
    return i;
}

/**
 * @brief  若检测到设备不是第一次使用,则读取EEPROM中的数据
 * @param  None
 * @retval 设备第一次使用? 1表示第一次
 */
template <class T>
size_t EepromCheck<T>::fetch(size_t addr, T &data)
{
    uint8_t *p;
    size_t i, len = sizeof(T) / sizeof(uint8_t);

    p = (uint8_t *)(&data);
    for (i = 0; i < len; i++)
    {
        p[i] = EEPROM.read(addr + i);
    }

    return i;
}

#endif  // !__EEPROM_CHECK_H_
